package com.whmskj.xjlhsc.schedul.delayTask;

import java.util.concurrent.DelayQueue;

/**
 * 延时任务调度器
 * 负责管理DelayQueue和执行线程
 */
public class DelayTaskScheduler {
    // 单例模式，确保全局只有一个调度器
    private static final DelayTaskScheduler INSTANCE = new DelayTaskScheduler();
    // 存储延时任务的阻塞队列
    private final DelayQueue<DelayTask> delayQueue = new DelayQueue<>();
    // 执行任务的线程
    private final Thread workerThread;

    private DelayTaskScheduler() {
        // 初始化工作线程
        workerThread = new Thread(this::processTasks, "DelayTaskWorker");
        workerThread.setDaemon(true); // 设为守护线程，随主线程退出
        workerThread.start(); // 启动线程
    }

    /**
     * 获取调度器实例
     */
    public static DelayTaskScheduler getInstance() {
        return INSTANCE;
    }

    /**
     * 添加延时任务到队列
     */
    public void addTask(DelayTask task) {
        if (task != null) {
            delayQueue.put(task); // 线程安全的添加方法
            System.out.println("任务 " + task.getTaskId() + " 已添加到延时队列");
        }
    }

    /**
     * 循环处理到期任务
     */
    private void processTasks() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                // take() 方法会阻塞，直到有任务到期
                DelayTask task = delayQueue.take();
                System.out.println("任务 " + task.getTaskId() + " 到期，开始执行");
                task.run(); // 执行任务
            } catch (InterruptedException e) {
                // 线程被中断，退出循环
                Thread.currentThread().interrupt();
                break;
            }
        }
    }

    /**
     * 关闭调度器（可选）
     */
    public void shutdown() {
        workerThread.interrupt();
        System.out.println("延时任务调度器已关闭");
    }
}
    